bleh
[mqlkit.git] / G.P.Morgan-KS v2.mq4
blob2f2be7cceaf847aeedea768aeac9d7a59dd1b5d4
1 #property copyright "Copyright © 2010, Pix"\r
2 extern string ST1 = "Lot Decimal Places e.g: 0.1 = 1, 0.01 = 2";\r
3 extern int lot_st = 2;\r
4 extern string ST2 = "Lot size";\r
5 extern double Lots = 0.1;\r
6 extern double LotExponent = 1.667;\r
7 extern double TakeProfit = 10;\r
8 extern double Stoploss = 500;\r
9 extern bool   UseTrailingStop = false;\r
10 extern double TrailStart = 10;\r
11 extern double TrailStop = 10;\r
12 extern double PipStep = 30;\r
13 int Insure1 = 0;\r
14 int Insure2 = 0;\r
15 extern int MaxTrades = 10;\r
16 extern bool UseEquityStop = false;\r
17 extern double TotalEquityRisk = 20; //loss as a percentage of equity\r
18 extern bool UseTimeOut = false;\r
19 extern double MaxTradeOpenHours = 48;\r
20 extern double slip = 3;\r
22 extern int MagicNumber = 88824;\r
23 double PriceTarget, StartEquity, BuyTarget, SellTarget;\r
24 double AveragePrice, SellLimit, BuyLimit;\r
25 double LastBuyPrice, LastSellPrice, ClosePrice, Spread;\r
26 int flag;\r
27 extern string EAName = "G.P.Morgan-KS";\r
28 datetime timeprev=0, expiration;\r
29 int NumOfTrades=0;\r
30 double iLots;\r
31 int cnt=0, total;\r
32 double Stopper=0;  \r
33 bool TradeNow = false, LongTrade=false, ShortTrade=false;\r
34 int ticket;\r
35 bool NewOrdersPlaced = false;// established order\r
37 int init()\r
38 {\r
39  Spread = MarketInfo(Symbol(), MODE_SPREAD)*Point;\r
40  return(0);\r
41 }\r
43 int deinit()\r
44 {\r
45  return(0);\r
46 }\r
48 int start()\r
49 {\r
50   \r
51  if (UseTrailingStop)   TrailingAlls(TrailStart, TrailStop, AveragePrice); //then\r
52  if (UseTimeOut) // default false\r
53   if(CurTime() >= expiration)             //then\r
54   {\r
55    CloseThisSymbolAll();\r
56    Print("Closed All due to TimeOut");\r
57   }\r
58   \r
59  if(timeprev==Time[0])\r
60   return(0);\r
61  timeprev=Time[0];\r
62  \r
63   double CurrentPairProfit = CalculateProfit(); //calculation of the current profit\r
64   if(UseEquityStop)//external parameter - such as "stop loss"\r
65   if(CurrentPairProfit<0 && MathAbs(CurrentPairProfit)>(TotalEquityRisk/100)*AccountEquityHigh())\r
66   {\r
67    CloseThisSymbolAll();\r
68    Print("Closed All due to Stop Out");\r
69    NewOrdersPlaced = false;\r
70   }\r
72    int total=OrdersTotal();\r
73   int count=0;\r
74   for(int pos=0;pos<total;pos++)\r
75     {\r
76      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==false) continue;\r
77       count++;\r
78     }\r
79  \r
80   total=CountTrades(); // number of deals with a specific identification number (open)\r
81   if (total == 0) flag = 0;\r
82   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)//test - in which direction is open transaction\r
83   {\r
84     OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);\r
86     if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)\r
87      continue;\r
88    \r
89     if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)\r
90     if(OrderType()==OP_BUY)\r
91     {\r
92      if(Insure1!=0||Insure2!=0)\r
93           if(Insure1==count||Insure2==count) \r
94             {\r
95             LongTrade = true;\r
96             ShortTrade = false;\r
97             break;\r
98             }\r
99             else {\r
100                   LongTrade = false;     \r
101                   ShortTrade = true;\r
102                   break;\r
103                  }\r
104             \r
105      else {\r
106           LongTrade = true;\r
107           ShortTrade = false;\r
108           break;\r
109           }\r
110     }\r
111     if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)\r
112     if(OrderType()==OP_SELL)\r
113     {\r
114      if(Insure1!=0||Insure2!=0)\r
115           if(Insure1==count||Insure2==count) \r
116             {\r
117             LongTrade = false;\r
118             ShortTrade = true;\r
119             break;\r
120             }\r
121             else {\r
122                   LongTrade = true;     \r
123                   ShortTrade = false;\r
124                   break;\r
125                  }\r
126             \r
127      else {\r
128           LongTrade = false;\r
129           ShortTrade = true;\r
130           break;\r
131           }\r
132     }\r
133   }\r
134   \r
135   if(total>0 && total <= MaxTrades)//if the schedule had gone more / less PipStep then open the transaction\r
136   {\r
137    RefreshRates();\r
138    LastBuyPrice = FindLastBuyPrice();\r
139    LastSellPrice = FindLastSellPrice();\r
140    if(LongTrade && (LastBuyPrice - Ask) >= (PipStep*Point))\r
141    {\r
142      TradeNow = true;\r
143    }\r
144    if(ShortTrade && (Bid - LastSellPrice) >= (PipStep*Point))\r
145    {\r
146      TradeNow = true;\r
147    }\r
148   } \r
149   \r
150   if (total < 1)\r
151   {\r
152    ShortTrade = false;\r
153    LongTrade = false;\r
154    TradeNow = true;\r
155    StartEquity = AccountEquity();//Returns the amount of own funds for the current account. The calculation of equity depends on the settings of the trading server. \r
156   }\r
158   if (TradeNow) //if the schedule more PipStep jerked open transaction in the opposite direction\r
159   {\r
160     LastBuyPrice = FindLastBuyPrice();\r
161     LastSellPrice = FindLastSellPrice();\r
162    if(ShortTrade)\r
163    {\r
164     NumOfTrades = total;\r
165     iLots = NormalizeDouble(Lots*MathPow(LotExponent,NumOfTrades),lot_st);\r
166     RefreshRates();\r
167     ticket = OpenPendingOrder(OP_SELL,iLots,Bid,slip,Ask,0,0,EAName+"-"+NumOfTrades,MagicNumber,0,HotPink);\r
168     if(ticket<0){Print("Error: ",GetLastError()); return(0);}\r
169      LastSellPrice = FindLastSellPrice();\r
170     TradeNow = false;\r
171     NewOrdersPlaced = true;\r
172    }\r
173    else if (LongTrade)\r
174    {   \r
175     NumOfTrades = total;\r
176     iLots = NormalizeDouble(Lots*MathPow(LotExponent,NumOfTrades),lot_st);\r
177     ticket = OpenPendingOrder(OP_BUY,iLots,Ask,slip,Bid,0,0,EAName+"-"+NumOfTrades,MagicNumber,0,Lime);\r
178     if(ticket<0){Print("Error: ",GetLastError()); return(0);}\r
179      LastBuyPrice = FindLastBuyPrice();\r
180     TradeNow = false;\r
181     NewOrdersPlaced = true;\r
182    }\r
183   }\r
184   \r
185   if (TradeNow && total<1) //If there is no open transactions\r
186   {\r
188    double PrevCl = iClose(Symbol(),0,2);//Returns the closing price\r
189    double CurrCl = iClose(Symbol(),0,1);\r
190     SellLimit = Bid;   \r
191     BuyLimit = Ask;\r
192    \r
193    if (!ShortTrade && !LongTrade)\r
194    {\r
195     NumOfTrades = total;\r
196     iLots = NormalizeDouble(Lots*MathPow(LotExponent,NumOfTrades),lot_st);\r
197     if(PrevCl > CurrCl)\r
198     {\r
199      ticket = OpenPendingOrder(OP_SELL,iLots,SellLimit,slip,SellLimit,0,0,EAName+"-"+NumOfTrades,MagicNumber,0,HotPink);\r
200      if(ticket<0){Print("Error: ",GetLastError()); return(0);}\r
201       LastBuyPrice = FindLastBuyPrice();\r
202      NewOrdersPlaced = true;\r
203     }   \r
204     else\r
205     {\r
206      ticket = OpenPendingOrder(OP_BUY,iLots,BuyLimit,slip,BuyLimit,0,0,EAName+"-"+NumOfTrades,MagicNumber,0,Lime);\r
207      if(ticket<0){Print("Error: ",GetLastError()); return(0);}\r
208       LastSellPrice = FindLastSellPrice();\r
209      NewOrdersPlaced = true;\r
210     }\r
211     if(ticket>0) expiration = CurTime()+MaxTradeOpenHours*60*60;\r
212     TradeNow = false;\r
213    }\r
214   }\r
216 //----------------------- CALCULATE AVERAGE OPENING PRICE\r
217    total=CountTrades();\r
218    AveragePrice=0;\r
219    double Count = 0;\r
220    for(cnt=OrdersTotal()-1;cnt>=0;cnt--)\r
221    {\r
222     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);\r
223     if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)\r
224      continue;\r
225     if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)\r
226      if(OrderType()==OP_BUY || OrderType()==OP_SELL)  \r
227       {\r
228        AveragePrice=AveragePrice+OrderOpenPrice()*OrderLots();\r
229        Count = Count + OrderLots();\r
230       }\r
231    }\r
232    if(total > 0)\r
233     AveragePrice=NormalizeDouble(AveragePrice/Count, Digits);\r
235    \r
236 //----------------------- RECALCULATE STOPLOSS & PROFIT TARGET BASED ON AVERAGE OPENING PRICE\r
237    if(NewOrdersPlaced)\r
238    for(cnt=OrdersTotal()-1;cnt>=0;cnt--)\r
239    {\r
240     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);\r
241     if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)\r
242      continue;\r
243     if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)\r
244      if(OrderType()==OP_BUY) // Calculate profit/stop target for long \r
245      {\r
246       PriceTarget=AveragePrice+(TakeProfit*Point);\r
247       BuyTarget = PriceTarget;\r
248       Stopper=AveragePrice-(Stoploss*Point); \r
249 //      Stopper=0; \r
250       flag = 1;\r
251      }\r
252     if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)\r
253      if(OrderType()==OP_SELL) // Calculate profit/stop target for short\r
254      {\r
255       PriceTarget=AveragePrice-(TakeProfit*Point);\r
256       SellTarget = PriceTarget;\r
257       Stopper=AveragePrice+(Stoploss*Point);  \r
258 //      Stopper=0; \r
259       flag = 1; \r
260      }\r
261    }\r
262 //----------------------- IF NEEDED CHANGE ALL OPEN ORDERS TO NEWLY CALCULATED PROFIT TARGET    \r
263   if(NewOrdersPlaced)\r
264   if(flag==1)// check if average has really changed\r
265   {   \r
266    for(cnt=OrdersTotal()-1;cnt>=0;cnt--)\r
267     {\r
268 //     PriceTarget=total;\r
269      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);            \r
270      if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)\r
271       continue;\r
272      if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)\r
273 //      OrderModify(OrderTicket(),0,Stopper,PriceTarget,0,Yellow);// set all positions to averaged levels\r
274       OrderModify(OrderTicket(),AveragePrice,OrderStopLoss(),PriceTarget,0,Yellow);// set all positions to averaged levels\r
275      NewOrdersPlaced = false;\r
276     }\r
277   }\r
280 int CountTrades()\r
282  int count=0;\r
283  int trade;\r
284  for(trade=OrdersTotal()-1;trade>=0;trade--)\r
285  {\r
286   OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);\r
287   \r
288   if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)\r
289    continue;\r
290    \r
291   if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)\r
292   if(OrderType()==OP_SELL || OrderType()==OP_BUY)\r
293    count++;\r
294  }//for\r
295  return(count);\r
299 void CloseThisSymbolAll()\r
301  int trade;\r
302  for(trade=OrdersTotal()-1;trade>=0;trade--)\r
303  {\r
304   OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);\r
306   if(OrderSymbol()!=Symbol())\r
307    continue;\r
308   if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)\r
309   {\r
310    if(OrderType()==OP_BUY)\r
311     OrderClose(OrderTicket(),OrderLots(),Bid,slip,Blue);\r
313    if(OrderType()==OP_SELL)\r
314     OrderClose(OrderTicket(),OrderLots(),Ask,slip,Red);\r
315   }\r
316   Sleep(1000);\r
317  }\r
320 int OpenPendingOrder(int pType,double pLots,double pLevel,int sp, double pr, int sl, int tp,string pComment,int pMagic,datetime pExpiration,color pColor)\r
322   int ticket=0;\r
323   int err=0;\r
324   int c = 0;\r
325   int NumberOfTries = 100;\r
326   switch (pType)\r
327   {\r
328       case OP_BUYLIMIT:\r
329          for(c = 0 ; c < NumberOfTries ; c++)\r
330          {\r
331             ticket=OrderSend(Symbol(),OP_BUYLIMIT,pLots,pLevel,sp,StopLong(pr,sl),TakeLong(pLevel,tp),pComment,pMagic,pExpiration,pColor);\r
332             err=GetLastError();\r
333             if(err==0)\r
334             { \r
335                break;\r
336             }\r
337             else\r
338             {\r
339                if(err==4 || err==137 ||err==146 || err==136) //Busy errors\r
340                {\r
341                   Sleep(1000);\r
342                   continue;\r
343                }\r
344                else //normal error\r
345                {\r
346                   break;\r
347                }  \r
348             }\r
349          }   \r
350          break;\r
351       case OP_BUYSTOP:\r
352          for(c = 0 ; c < NumberOfTries ; c++)\r
353          {\r
354             ticket=OrderSend(Symbol(),OP_BUYSTOP,pLots,pLevel,sp,StopLong(pr,sl),TakeLong(pLevel,tp),pComment,pMagic,pExpiration,pColor);\r
355             err=GetLastError();\r
356             if(err==0)\r
357             { \r
358                break;\r
359             }\r
360             else\r
361             {\r
362                if(err==4 || err==137 ||err==146 || err==136) //Busy errors\r
363                {\r
364                   Sleep(5000);\r
365                   continue;\r
366                }\r
367                else //normal error\r
368                {\r
369                   break;\r
370                }  \r
371             }\r
372          } \r
373          break;\r
374       case OP_BUY:\r
375          for(c = 0 ; c < NumberOfTries ; c++)\r
376          {  \r
377             RefreshRates();\r
378             ticket=OrderSend(Symbol(),OP_BUY,pLots,Ask,sp,StopLong(Bid,sl),TakeLong(Ask,tp),pComment,pMagic,pExpiration,pColor);\r
379             err=GetLastError();\r
380             if(err==0)\r
381             { \r
382                break;\r
383             }\r
384             else\r
385             {\r
386                if(err==4 || err==137 ||err==146 || err==136) //Busy errors\r
387                {\r
388                   Sleep(5000);\r
389                   continue;\r
390                }\r
391                else //normal error\r
392                {\r
393                   break;\r
394                }  \r
395             }\r
396          } \r
397          break;\r
398       case OP_SELLLIMIT:\r
399          for(c = 0 ; c < NumberOfTries ; c++)\r
400          {\r
401             ticket=OrderSend(Symbol(),OP_SELLLIMIT,pLots,pLevel,sp,StopShort(pr,sl),TakeShort(pLevel,tp),pComment,pMagic,pExpiration,pColor);\r
402             err=GetLastError();\r
403             if(err==0)\r
404             { \r
405                break;\r
406             }\r
407             else\r
408             {\r
409                if(err==4 || err==137 ||err==146 || err==136) //Busy errors\r
410                {\r
411                   Sleep(5000);\r
412                   continue;\r
413                }\r
414                else //normal error\r
415                {\r
416                   break;\r
417                }  \r
418             }\r
419          } \r
420          break;\r
421       case OP_SELLSTOP:\r
422          for(c = 0 ; c < NumberOfTries ; c++)\r
423          {\r
424             ticket=OrderSend(Symbol(),OP_SELLSTOP,pLots,pLevel,sp,StopShort(pr,sl),TakeShort(pLevel,tp),pComment,pMagic,pExpiration,pColor);\r
425             err=GetLastError();\r
426             if(err==0)\r
427             { \r
428                break;\r
429             }\r
430             else\r
431             {\r
432                if(err==4 || err==137 ||err==146 || err==136) //Busy errors\r
433                {\r
434                   Sleep(5000);\r
435                   continue;\r
436                }\r
437                else //normal error\r
438                {\r
439                   break;\r
440                }  \r
441             }\r
442          } \r
443          break;\r
444       case OP_SELL:\r
445          for(c = 0 ; c < NumberOfTries ; c++)\r
446          {\r
447             ticket=OrderSend(Symbol(),OP_SELL,pLots,Bid,sp,StopShort(Ask,sl),TakeShort(Bid,tp),pComment,pMagic,pExpiration,pColor);\r
448             err=GetLastError();\r
449             if(err==0)\r
450             { \r
451                break;\r
452             }\r
453             else\r
454             {\r
455                if(err==4 || err==137 ||err==146 || err==136) //Busy errors\r
456                {\r
457                   Sleep(5000);\r
458                   continue;\r
459                }\r
460                else //normal error\r
461                {\r
462                   break;\r
463                }  \r
464             }\r
465          } \r
466          break;\r
467   } \r
468   \r
469   return(ticket);\r
470 }  \r
472 double StopLong(double price,int stop)\r
474  if(stop==0)\r
475   return(0);\r
476  else\r
477   return(price-(stop*Point));\r
480 double StopShort(double price,int stop)\r
482  if(stop==0)\r
483   return(0);\r
484  else\r
485   return(price+(stop*Point));\r
488 double TakeLong(double price,int take)\r
490  if(take==0)\r
491   return(0);\r
492  else\r
493   return(price+(take*Point));\r
496 double TakeShort(double price,int take)\r
498  if(take==0)\r
499   return(0);\r
500  else\r
501   return(price-(take*Point));\r
505 double CalculateProfit()\r
508    double Profit=0;\r
509    for(cnt=OrdersTotal()-1;cnt>=0;cnt--)\r
510    {\r
511     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);\r
512     if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)\r
513      continue;\r
514     if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)\r
515      if(OrderType()==OP_BUY || OrderType()==OP_SELL)  \r
516       {\r
517        Profit=Profit+OrderProfit();\r
518       }\r
519    }\r
521   return(Profit);\r
524 void TrailingAlls(int start,int stop, double AvgPrice)\r
526  int profit;\r
527  double stoptrade;\r
528  double stopcal;\r
529  \r
530  if(stop==0)\r
531   return;\r
532  \r
533  int trade;\r
534  for(trade=OrdersTotal()-1;trade>=0;trade--)\r
535  {\r
536   if(!OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))\r
537    continue;\r
539   if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)\r
540    continue;\r
542   if(OrderSymbol()==Symbol()||OrderMagicNumber()==MagicNumber)\r
543   {\r
544    if(OrderType()==OP_BUY)\r
545    {\r
546     profit=NormalizeDouble((Bid-AvgPrice)/Point,0);\r
547     if(profit<start)\r
548      continue;\r
549     stoptrade=OrderStopLoss();\r
550     stopcal=Bid-(stop*Point);\r
551     if(stoptrade==0||(stoptrade!=0&&stopcal>stoptrade))\r
552 //     OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Blue);\r
553      OrderModify(OrderTicket(),AvgPrice,stopcal,OrderTakeProfit(),0,Aqua);\r
554    }//Long\r
555   \r
556    if(OrderType()==OP_SELL)\r
557    {\r
558     profit=NormalizeDouble((AvgPrice-Ask)/Point,0);\r
559     if(profit<start)\r
560      continue;\r
561     stoptrade=OrderStopLoss();\r
562     stopcal=Ask+(stop*Point);\r
563     if(stoptrade==0||(stoptrade!=0&&stopcal<stoptrade))\r
564 //     OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Red);\r
565      OrderModify(OrderTicket(),AvgPrice,stopcal,OrderTakeProfit(),0,Red);\r
566    }//Shrt\r
567   }\r
568   Sleep(1000);\r
569  }//for\r
575 double AccountEquityHigh()\r
577  static double AccountEquityHighAmt,PrevEquity;\r
578   if(CountTrades()==0) AccountEquityHighAmt=AccountEquity();\r
579    if(AccountEquityHighAmt < PrevEquity) AccountEquityHighAmt=PrevEquity;\r
580    else AccountEquityHighAmt=AccountEquity();\r
581   PrevEquity = AccountEquity();\r
582  return(AccountEquityHighAmt);\r
586 double FindLastBuyPrice()//returns the number of the last transaction buy\r
588  double oldorderopenprice = 0, orderprice;\r
589  int cnt, oldticketnumber = 0, ticketnumber;\r
590  \r
591  for(cnt=OrdersTotal()-1;cnt>=0;cnt--)\r
592  {\r
593   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);\r
594   if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)\r
595    continue;\r
596   if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderType()==OP_BUY)  \r
597   {\r
598      ticketnumber = OrderTicket();\r
599      if(ticketnumber>oldticketnumber)\r
600      {\r
601       orderprice=OrderOpenPrice();\r
602       oldorderopenprice=orderprice;\r
603       oldticketnumber=ticketnumber;\r
604      }\r
605   }\r
606  }\r
607  \r
608   return(orderprice);\r
611 double FindLastSellPrice()\r
613  double oldorderopenprice = 0, orderprice;\r
614  int cnt, oldticketnumber = 0, ticketnumber;\r
615  \r
616  for(cnt=OrdersTotal()-1;cnt>=0;cnt--)\r
617  {\r
618   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);\r
619   if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)\r
620    continue;\r
621   if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderType()==OP_SELL)  \r
622   {\r
623      ticketnumber = OrderTicket();\r
624      if(ticketnumber>oldticketnumber)\r
625      {\r
626       orderprice=OrderOpenPrice();\r
627       oldorderopenprice=orderprice;\r
628       oldticketnumber=ticketnumber;\r
629      }\r
630   }\r
631  }\r
632  \r
633   return(orderprice);\r